package com.itheima.controller;

import com.itheima.pojo.Dept;
import com.itheima.pojo.Result;
import com.itheima.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Description DeptController
 * @Author songyu
 * @Date 2024-01-23
 */
@Slf4j //lombok提供的注解，底层是log4j实现
@RestController //创建控制器类对象并加入spring容器, 并且将方法返回值转换为json字符串给到前端
@RequestMapping("/depts") //在类上通过这个注解设置通用路径，在方法上写不同的子路径
public class DeptController {

    @Autowired
    private DeptService deptService;

    /**
     * 处理查询部门列表数据请求
     * @return
     */
    @GetMapping //处理get请求，并设置请求路径
    public Result list(){
        log.info("正在执行查询部门列表数据操作...");

        //调用业务获取部门列表数据
        List<Dept> deptList = deptService.list();

        //返回数据
        return Result.success(deptList);

    }

    /**
     * 处理删除部门请求
     * 路径参数
     *      符合restful风格路径传递数据
     *      路径参数在路径中使用占位符{参数名}表示：/路径/{id}
     *          controller方法里面参数获取路径参数格式1(占位符参数名与方法参数名一致)：@PathVariable Integer id
     *          controller方法里面参数获取路径参数格式2(占位符参数名与方法参数名不一致)：@PathVariable("id") Integer deptId
     *          通过@PathVariable注解设置就可以将占位符{id}的数据传递给方法参数id或deptId
     *      注意：为什么要用占位符名字，是为了区分路径传递的多个数据，示例如下
     *          前端访问路径：/depts/1/开发部/深圳
     *          后端接收占位符格式：/depts/{id}/{name}/{address}
     *          controller方法获取参数值： public Result delete(@PathVariable Integer id,
     *                                                        @PathVariable String name,
     *                                                        @PathVariable("address") String addr)
     *
     * @return
     */
    //复杂写法：@RequestMapping(value = "/depts/{id}",method = RequestMethod.DELETE)
    @DeleteMapping("/{id}") //简写方式，处理Delete请求
    public Result delete(@PathVariable Integer id){
        log.info("处理删除部门请求，传递的路径参数值：{}",id); //打印日志，将id填充到里面{}位置进行打印

        //调用业务进行删除部门逻辑
        deptService.delete(id);

        //返回前端
        return Result.success();
    }

    /**
     * 处理添加部门请求
     * @param dept
     * @return
     */
    @PostMapping
    public Result add(@RequestBody Dept dept){

        log.info("处理添加部门请求，新增部门数据：{}",dept);

        //调用业务进行添加部门操作
        deptService.add(dept);

        //返回数据
        return Result.success();
    }

    @GetMapping("/{id}")
    public Result findById(@PathVariable Integer id){
        Dept dept = deptService.findById(id);
        return Result.success(dept);
    }

    @PutMapping
    public Result update(@RequestBody Dept dept){
        deptService.update(dept);
        return Result.success();
    }
}
